<?php

namespace app\admin\controller;


use app\admin\model\Menu;

/**
 * Jack Wang
 * 菜单控制器
 * Class Menus
 * @package app\admin\controller
 */
class Menus extends Base
{

    //菜单列表
    public function index(){
        $Menu = new Menu();
        $keyword = input("keyword/s");
        if(input("?table")) {
            $result["code"] = 0;
            $result["data"] = $Menu->menuList($keyword);
            $result["data"] = collection($result["data"])->toArray();
            if(empty($keyword)) {//搜索不保持树结构
                $result["data"] =  Menus::arrayToTree($result["data"]);
            }
        }
        return !empty($result) ? json($result) : view('index',[
            'title'                 =>  '菜单列表',
        ]);
    }

    //添加修改菜单
    public function add(){
        $menu_id = input("menu_id/d",0);
        $Menu = new Menu();
        if(request()->isPost()){
            $data = input("post.");
            $msg = $Menu->checkData($data, [
                ["menu_name", "require", "菜单名称不能为空"],
            ]);
            if ($msg === true) {
                if($Menu->checkFieldOnly("menu_name",$data["menu_name"],"menu_id",$menu_id)){
                    $result["code"] = 1;
                    $result["msg"] = '菜单名称已存在';
                }else {
                    if ($Menu->mySave($data,'menu_id', $menu_id)) {
                        $result["code"] = 0;
                        $result["msg"] = "操作成功!";
                    } else {
                        $result["code"] = 10000;
                        $result["msg"] = "操作失败!";
                    }
                }
            }else {
                $result["code"] = 1;
                $result["msg"] = $msg;
            }
        }else {
            if (!empty($menu_id)) {
                //$menu_id存在就获取详情
                $dataInfo = $Menu->dataInfo("menu_id",$menu_id);
                $this->assign('dataInfo', $dataInfo);
            }
            $menuAllList = $Menu->menuList();
            $menuAllList = Menus::arrayToTree(collection($menuAllList)->toArray());//获取树结构菜单下拉使用
            $this->assign('menuAllList', $menuAllList);
        }
        return !empty($result) ? json($result) : view('add',[
            'title'             =>  '添加修改菜单',
            'AuthorityRadio'    =>  config('AuthorityRadio'),
            'MenuTypeRadio'     =>  config('MenuTypeRadio'),
            'IsNoRadio'         =>  config('IsNoRadio'),
        ]);
    }

    //删除菜单
    public function del(){
        $menu_id = input("menu_id/d",0);
        $Menu = new Menu();
        if(!empty($menu_id)){
            if($Menu->del("menu_id",$menu_id,true)){
                $result["code"] = 0;
                $result["msg"] = "操作成功!";
            }else{
                $result["code"] = 10000;
                $result["msg"] = "操作失败，有子菜单的上级菜单不能直接删除!";
            }
        }else{
            $result["code"] = 1;
            $result["msg"] = "menu_id参数为空!";
        }
        return json($result);
    }

    //菜单列表修改菜单位置显示状态
    public function editPositionDisplay(){
        $menu_id = input("menu_id/d",0);
        $Menu = new Menu();
        $data = input("post.");
        $msg = $Menu->checkData($data, [
            ["menu_id", "require", "menu_id不能为空"]
        ]);
        if ($msg === true) {
            if ($Menu->mySave($data,"menu_id",$menu_id)) {
                $result["code"] = 0;
                $result["msg"] = "操作成功!";
            } else {
                $result["code"] = 10000;
                $result["msg"] = "操作失败!";
            }
        }else {
            $result["code"] = 1;
            $result["msg"] = $msg;
        }
        return json($result);
    }

    //获取菜单树结构
    public static function arrayToTree($array, $pid =0, $level = 0,$idFiled = "menu_id"){
        //声明静态数组,避免递归调用时,多次声明导致数组覆盖
        static $list = [];
        if(!empty($array)) {
            foreach ($array as $key => $value) {
                //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
                if ($value['parent_id'] == $pid) {
                    //父节点为根节点的节点,级别为0，也就是第一级
                    $value['level'] = $level;
                    $value['level_name'] = str_repeat('--&nbsp;', $value['level']);
                    //把数组放到list中
                    $list[] = $value;
                    //把这个节点从数组中移除,减少后续递归消耗
                    unset($array[$key]);
                    //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
                    Menus::arrayToTree($array, $value[$idFiled], $level + 1, $idFiled);
                }
            }
        }
        return $list;
    }

}
